/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package jp.co.irep.juten.controller;

import java.awt.Image;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ManagedProperty;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.Part;
import jp.co.irep.juten.entity.Product;
import jp.co.irep.juten.facade.ProductFacade;
import jp.co.irep.juten.utils.BeanUtil;
import jp.co.irep.juten.utils.Consts;
import jp.co.irep.juten.view.ProductViewBean;

/**
 *
 * @author binh_dinh
 */
@Named
public class ProductControllerBean {

    private final List<String> deleteFlgList = Consts.DELETE_FLG;
    @Inject
    private ProductViewBean productViewBean;
    @EJB
    private ProductFacade productFacade;

    public ProductViewBean getProductViewBean() {
        return productViewBean;
    }

    public void setProductViewBean(ProductViewBean productViewBean) {
        this.productViewBean = productViewBean;
    }

    public ProductFacade getProductFacade() {
        return productFacade;
    }

    public void setProductFacade(ProductFacade productFacade) {
        this.productFacade = productFacade;
    }

    public String goToAddPage() {
        return Consts.CREATE;
    }

    /**
     * jsfページのoutputTextをセット
     *
     * @return
     */
    public String goToEditPage() {
        if (getProductViewBean().getSelectedProduct() != null) {
            Product p = getProductViewBean().getSelectedProduct();
            getProductViewBean().setId(p.getId());
            getProductViewBean().setName(p.getName());
            getProductViewBean().setMakerId(p.getMakerId());
            getProductViewBean().setImage1(p.getImage1());
            getProductViewBean().setImage2(p.getImage2());
            getProductViewBean().setImage3(p.getImage3());
            getProductViewBean().setImage4(p.getImage4());
            getProductViewBean().setContent(p.getContent());
            getProductViewBean().setOrderId(p.getOrderId());
            if (p.getDeleteFlg() == 1) {
                getProductViewBean().setDeleteFlgBool(true);
            } else {
                getProductViewBean().setDeleteFlgBool(false);
            }
            getProductViewBean().setMakerId(p.getMakerId());
            return Consts.EDIT;
        }
        return Consts.ERROR;
    }

    /**
     * 選択された商品を削除の上にその商品の画像ファイルを削除
     */
    public void delete() {
        if (getProductViewBean().getSelectedProduct() != null) {
            Product p = getProductViewBean().getSelectedProduct();
            if (p.getImage1() != null) {
                deleteFile(p.getImage1());
            }
            if (p.getImage2() != null) {
                deleteFile(p.getImage2());
            }
            if (p.getImage3() != null) {
                deleteFile(p.getImage3());
            }
            if (p.getImage4() != null) {
                deleteFile(p.getImage4());
            }
            getProductFacade().remove(p);
            findCommon();
            BeanUtil.setMessage(Consts.INFO, BeanUtil.getMessageString("product.delete.success"));
        }

    }

    /**
     * 新規商品を格納
     *
     * @return
     */
    public String saveNew() {
        Product product = new Product();
        String err = "";

        //入力をチェック:アップロードファイル
        err = checkInput();

        // 入力が正しい場合       
        if (err.equals("")) {
            //ファイル１を選択された
            if (!getProductViewBean().getFile1().getContentType().equals("application/octet-stream")) {
                upLoadFile(getProductViewBean().getFile1());
                product.setImage1(extractFileName(getProductViewBean().getFile1()));
            }
            //ファイル２を選択された
            if (!getProductViewBean().getFile2().getContentType().equals("application/octet-stream")) {
                upLoadFile(getProductViewBean().getFile2());
                product.setImage2(extractFileName(getProductViewBean().getFile2()));
            }
            //ファイル３を選択された
            if (!getProductViewBean().getFile3().getContentType().equals("application/octet-stream")) {
                upLoadFile(getProductViewBean().getFile3());
                product.setImage3(extractFileName(getProductViewBean().getFile3()));
            }
            //ファイル４を選択された
            if (!getProductViewBean().getFile4().getContentType().equals("application/octet-stream")) {
                upLoadFile(getProductViewBean().getFile4());
                product.setImage4(extractFileName(getProductViewBean().getFile4()));
            }
            //非表示をチェックされた
            if (getProductViewBean().isDeleteFlgBool()) {
                getProductViewBean().setDeleteFlg(1);
            } else {
                getProductViewBean().setDeleteFlg(0);
            }
            product.setDate(new Date());
            setParameterForProduct(product);
            getProductFacade().create(product);
            reset();
            find();
            BeanUtil.setMessage(Consts.INFO, BeanUtil.getMessageString("product.saveNew.success"));
            return Consts.INDEX;
        }
        {
            BeanUtil.setMessage(Consts.ERROR, err);
            return Consts.ERROR;
        }

    }

    /**
     * 編集された商品を格納
     *
     * @return
     */
    public String save() {
        Product product = getProductViewBean().getSelectedProduct();
        String err = "";

        //入力をチェック：アップロードファイル
        err = checkInput();

        //入力が正しい場合         
        if (err.equals("")) {
            //ファイル１を選択された
            if (!getProductViewBean().getFile1().getContentType().equals("application/octet-stream")) {
                upLoadFile(getProductViewBean().getFile1());
                product.setImage1(extractFileName(getProductViewBean().getFile1()));
            } else {
                if (getProductViewBean().isDelImage1()) // if delete Image1 checkbox is checked
                {
                    deleteFile(getProductViewBean().getImage1());
                    product.setImage1(null);
                }
            }
            //ファイル2を選択された
            if (!getProductViewBean().getFile2().getContentType().equals("application/octet-stream")) {
                upLoadFile(getProductViewBean().getFile2());
                product.setImage2(extractFileName(getProductViewBean().getFile2()));
            } else {
                if (getProductViewBean().isDelImage2()) // if delete Image2 checkbox is checked
                {
                    deleteFile(getProductViewBean().getImage2());
                    product.setImage2(null);
                }
            }
            //ファイル3を選択された
            if (!getProductViewBean().getFile3().getContentType().equals("application/octet-stream")) {
                upLoadFile(getProductViewBean().getFile3());
                product.setImage3(extractFileName(getProductViewBean().getFile3()));
            } else {
                if (getProductViewBean().isDelImage3()) // if delete Image3 checkbox is checked
                {
                    deleteFile(getProductViewBean().getImage3());
                    product.setImage3(null);
                }
            }
            //ファイル4を選択された
            if (!getProductViewBean().getFile4().getContentType().equals("application/octet-stream")) {
                upLoadFile(getProductViewBean().getFile4());
                product.setImage4(extractFileName(getProductViewBean().getFile4()));
            } else {
                if (getProductViewBean().isDelImage4()) // if delete Image4 checkbox is checked
                {
                    deleteFile(getProductViewBean().getImage4());
                    product.setImage4(null);
                }
            }
            //非表示をチェックされた
            if (getProductViewBean().isDeleteFlgBool()) {
                getProductViewBean().setDeleteFlg(1);
            } else {
                getProductViewBean().setDeleteFlg(0);
            }
            setParameterForProduct(product);
            getProductFacade().edit(product);
            reset();
            find();
            BeanUtil.setMessage(Consts.INFO, BeanUtil.getMessageString("product.save.success"));
            return Consts.INDEX;
        } else {
            BeanUtil.setMessage(Consts.ERROR, err);
            return Consts.ERROR;
        }

    }

    /**
     * 選択されたファイルをアップロード
     *
     * @param file
     * @return
     */
    public boolean upLoadFile(Part file) {
        InputStream inputStream;
        OutputStream out;
        try {
            ExternalContext extContext = FacesContext.getCurrentInstance()
                    .getExternalContext();
            String webinf = extContext.getRealPath("//WEB-INF");
            File targetFolder = new File(webinf + "/../images");
            inputStream = file.getInputStream();
            out = new FileOutputStream(new File(targetFolder,
                    extractFileName(file)));
            int read = 0;
            byte[] bytes = new byte[1024];
            while ((read = inputStream.read(bytes, 0, 1024)) != -1) {
                out.write(bytes, 0, read);
            }
            out.flush();
            inputStream.close();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 商品名とメーカーIDにより検索
     */
    public void findCommon() {
        List<Product> productList = new ArrayList<Product>();
        Map<String, Object> productMapper = new HashMap<String, Object>();
        productMapper.put("name", "%" + getProductViewBean().getNameSearch() + "%");
        productMapper.put("makerId", getProductViewBean().getMakerIdSearch());
        productList = getProductFacade().find(productMapper);
        getProductViewBean().setProductList(productList);
    }

    public String find() {
        findCommon();
        return Consts.INDEX;
    }

    /**
     * 選択されたファイルの拡張子とサイズをチェック
     *
     * @param file
     * @return
     */
    public String checkInValidUploadedFile(Part file) {
        String err = "";
        InputStream inputStream;
        String type = file.getContentType();
        if (type.equals("image/jpg") || type.equals("image/png")
                || type.equals("image/gif") || type.equals("image/jpeg")) {
            Image img;
            try {
                inputStream = file.getInputStream();
                img = ImageIO.read(inputStream);
                int w = img.getWidth(null);
                int h = img.getHeight(null);
                if (w > 120 || h > 120) {
                    err += "アップロードできないサイズです。アップロード可能なサイズは「横120px X 縦120px」以内です。\n";
                }
            } catch (IOException e) {
                // TODO 自動生成された catch ブロック
                e.printStackTrace();
            }
        } else {
            err += "アップロードできない拡張子です。アップロード可能な拡張子は「.jpeg」「.jpg」「.gif」「.png」です。\n";
        }
        return err;

    }

    /**
     * ファイルを削除
     *
     * @param image
     */
    public void deleteFile(String image) {
        ExternalContext extContext = FacesContext.getCurrentInstance()
                .getExternalContext();
        String webinf = extContext.getRealPath("//WEB-INF");
        File targetFolder = new File(webinf + "/../images");
        File file = new File(targetFolder + "/" + image);
        if (file.exists()) {
            file.delete();
        }
    }

    public String checkInput() {
        String er = "";
        String err = "";
        //あるファイルを選択された
        if (!getProductViewBean().getFile1().getContentType().equals("application/octet-stream")) {
            if (!(er = checkInValidUploadedFile(getProductViewBean().getFile1())).equals("")) {
                err += er;
            }
        }
        //あるファイルを選択された
        if (!getProductViewBean().getFile2().getContentType().equals("application/octet-stream")) {
            if (!(er = checkInValidUploadedFile(getProductViewBean().getFile2())).equals("")) {
                err += er;
            }
        }
        //あるファイルを選択された
        if (!getProductViewBean().getFile3().getContentType().equals("application/octet-stream")) {
            if (!(er = checkInValidUploadedFile(getProductViewBean().getFile3())).equals("")) {
                err += er;
            }
        }
        //あるファイルを選択された                                   
        if (!getProductViewBean().getFile4().getContentType().equals("application/octet-stream")) {
            if (!(er = checkInValidUploadedFile(getProductViewBean().getFile4())).equals("")) {
                err += er;
            }
        }
        return err;
    }

    public void reset() {
        getProductViewBean().setNameSearch("");
        getProductViewBean().setMakerIdSearch(0);
        getProductViewBean().setName("");
        getProductViewBean().setMakerId(0);
        getProductViewBean().setDeleteFlgBool(false);
        getProductViewBean().setContent("");
        getProductViewBean().setOrderId(0);
        getProductViewBean().setDelImage1(false);
        getProductViewBean().setDelImage2(false);
        getProductViewBean().setDelImage3(false);
        getProductViewBean().setDelImage4(false);
    }

    public void setParameterForProduct(Product product) {
        product.setName(getProductViewBean().getName());
        product.setMakerId(getProductViewBean().getMakerId());
        product.setOrderId(getProductViewBean().getOrderId());
        product.setDeleteFlg(getProductViewBean().getDeleteFlg());
        product.setContent(getProductViewBean().getContent());
        product.setUpdate(new Date());

    }

    public List<String> getDeleteFlgList() {
        return deleteFlgList;
    }

    /**
     * アップロードファイルの名前を抽出
     *
     * @param part
     * @return
     */
    public String extractFileName(Part part) {
        String contentDisp = part.getHeader("content-disposition");
        System.out.println("CONTENTDISP"+contentDisp);
        String[] items = contentDisp.split(";");
        for (String s : items) {
            if (s.trim().startsWith("filename")) {
                System.out.println("FILENAME"+s);
                return s.substring(s.indexOf("=") + 2, s.length() - 1);
            }
        }
        return "";
    }

}
